<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Upload extends Public_Controller
{
	protected $_userData = null;
	protected $_path = '';
	protected $_pathVideo = '';
	
	public function __construct()
	{
		parent::__construct();
		$this->load->library('session');
		$this->_userData = $this->session->all_userData();
		if(!isset($this->_userData['logged_in']) || !$this->_userData['logged_in']){
			redirect('./');
		}
		$this->load->model('uploking_users_m');
		$this->load->model('uploking_folders_m');
		$this->load->model('uploking_files_m');
		
		$this->load->library(array('keywords/keywords'));
		$this->load->library('form_validation');
		$this->load->helper('uploking');
		$this->lang->load('uploking');
		$this->config->load('uploking');
		$this->_path = FCPATH . $this->config->item('files_folder');
		$this->_pathVideo = FCPATH . $this->config->item('files_video_folder');
	}

	public function index()
	{
		if(!$this->input->is_ajax_request()){
			redirect('./');
		}
		$this->input->is_ajax_request() ? $this->template->set_layout(FALSE) : '';
				
		$this->template
			->title($this->module_details['name'])
			->build('upload', $this->data);
	}
	public function do_upload(){
		//$targetDir = './uploads';
		//$videoDir = './uploads/videos';
		$folder = uploking_getFolderName();
		$targetDir = $this->_path . DIRECTORY_SEPARATOR . $folder;
		$videoDir =  $this->_pathVideo . DIRECTORY_SEPARATOR . $folder;

		$cleanupTargetDir = true; // Remove old files
		$maxFileAge = 5 * 3600; // Temp file age in seconds

		// 5 minutes execution time
		@set_time_limit(5 * 60);

		// Uncomment this one to fake upload time
		// usleep(5000);

		// Get parameters
		$chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
		$chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0;
		$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : '';

		// Clean the fileName for security reasons
		$fileName = preg_replace('/[^\w\._]+/', '_', $fileName);

		// Make sure the fileName is unique but only if chunking is disabled
		if ($chunks < 2 && file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName)) {
			$ext = strrpos($fileName, '.');
			$fileName_a = substr($fileName, 0, $ext);
			$fileName_b = substr($fileName, $ext);

			$count = 1;
			while (file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b))
			$count++;

			$fileName = $fileName_a . '_' . $count . $fileName_b;
		}

		$filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;

		// Create target dir
		if (!file_exists($targetDir))
		@mkdir($targetDir);
		if (!file_exists($videoDir))
		@mkdir($videoDir);

		// Remove old temp files
		if ($cleanupTargetDir && is_dir($targetDir) && ($dir = opendir($targetDir))) {
			while (($file = readdir($dir)) !== false) {
				$tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file;

				// Remove temp file if it is older than the max age and is not the current file
				if (preg_match('/\.part$/', $file) && (filemtime($tmpfilePath) < time() - $maxFileAge) && ($tmpfilePath != "{$filePath}.part")) {
					@unlink($tmpfilePath);
				}
			}

			closedir($dir);
		} else
		die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');


		// Look for the content type header
		if (isset($_SERVER["HTTP_CONTENT_TYPE"]))
		$contentType = $_SERVER["HTTP_CONTENT_TYPE"];

		if (isset($_SERVER["CONTENT_TYPE"]))
		$contentType = $_SERVER["CONTENT_TYPE"];

		// Handle non multipart uploads older WebKit versions didn't support multipart in HTML5
		if (strpos($contentType, "multipart") !== false) {
			if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
				// Open temp file
				$out = fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");
				if ($out) {
					// Read binary input stream and append it to temp file
					$in = fopen($_FILES['file']['tmp_name'], "rb");

					if ($in) {
						while ($buff = fread($in, 4096))
						fwrite($out, $buff);
					} else
					die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
					fclose($in);
					fclose($out);
					@unlink($_FILES['file']['tmp_name']);
				} else
				die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
			} else
			die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
		} else {
			// Open temp file
			$out = fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");
			if ($out) {
				// Read binary input stream and append it to temp file
				$in = fopen("php://input", "rb");

				if ($in) {
					while ($buff = fread($in, 4096))
					fwrite($out, $buff);
				} else
				die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');

				fclose($in);
				fclose($out);
			} else
			die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
		}

		// Check if file has been uploaded
		if (!$chunks || $chunk == $chunks - 1) {
			// Strip the temp .part suffix off
			rename("{$filePath}.part", $filePath);
			
			if(isset($this->_userData['current_folder_id'])){
				$current_folder_id = $this->_userData['current_folder_id'];
			}else{
				$current_folder_id = 0;
			}
			/*
			$finfo = finfo_open(FILEINFO_MIME_TYPE);
			$mimetype = finfo_file($finfo, $filePath);
			finfo_close($finfo);
			$mimetype = mime_content_type($filePath);
			*/
			$mimetype = $_FILES['file']['type'];		
			
			if(!$mimetype){
				$mimetype = '';
				$type = 'o';
			}else{
				$type = substr($mimetype, 0, 1);
			}
			
			$path_info = pathinfo($fileName);
   			$extension = $path_info['extension'];
			
			$this->uploking_files_m->insert(array(
				'folder_id'	=> $current_folder_id,
				'user_id'	=> $this->_userData['account']['user_id'],
				'type'		=> $type,
				'name'		=> $fileName,
				'filename'	=> $fileName,
				'folder'	=> $folder,
				'extension'	=> $extension,
				'mimetype'	=> $mimetype,
				'filesize'	=> filesize($filePath),
				'date_added'=> time(),
				'sort'		=> 0
			));
			
			$videoExtList = $this->config->item('video_extension_list');
			/*
			if($extension == 'flv'){
				copy($filePath, $targetDir . DIRECTORY_SEPARATOR .$fileName, $videoDir.DIRECTORY_SEPARATOR.$fileName.".flv");
			}else if(in_array($extension, $videoExtList)){
				echo "here";
				system("ffmpeg -i ".$filePath." -ar 22050 -ab 32 -f flv -s 320x240 ".$videoDir.DIRECTORY_SEPARATOR.$fileName.".flv");
				//system("ffmpeg -i video.avi -ar 22050 -ab 32 -f flv -s 320x240 video.flv");
			}
			*/
			if(in_array($extension, $videoExtList)){
				system("ffmpeg -i ".$filePath." -ar 22050 -ab 32 -f flv -s 320x240 ".$videoDir.DIRECTORY_SEPARATOR.$fileName.".flv");
				//system("ffmpeg -i video.avi -ar 22050 -ab 32 -f flv -s 320x240 video.flv");
			}
		}


		// Return JSON-RPC response
		die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');

	}
}
